'use strict';

const Controller = require('egg').Controller;
const jwt = require('jsonwebtoken');

const GiteePage = {
  client_id: 'e58e7fa36aeb6a570472505607bc916bc7bc0f8b5f94edb0e4b74989ce69c0d4',
  redirect_uri: 'http://10.1.235.21:3000/login',
  client_secret: '8262f28894a9fe3ae7d8a5df918e5f18fff7a1f668a79bcf3b577cb32e59d59e',
};

class LoginController extends Controller {
  async login() {
    const { ctx, app } = this;

    // 获取前端传来的用户名和密码
    const { username, password } = ctx.request.body;

    // 验证
    const data = await app.mysql.get('userlist', { username, password });

    if (data) {
      ctx.body = {
        token: jwt.sign(data.id, '1907A'),
        code: 1,
      };
    } else {
      ctx.status = 401;

      ctx.body = {
        code: 0,
        msg: '用户名或者密码错误',
      };
    }
  }

  // 获取用户信息
  async getUserInfo() {
    const { ctx, app } = this;

    const { authorization } = ctx.request.headers;

    try {
      // 解密
      const id = jwt.verify(authorization, '1907A');

      // 通过id 获取用户信息
      const data = await app.mysql.get('userlist', { id });

      ctx.body = {
        code: 1,
        data,
      };
    } catch (error) {
      // 如果解密失败
      ctx.body = {
        code: 0,
        msg: '登录已过期 请重新登录',
      };
    }
  }

  // 第三方登录
  async giteeLogin() {
    const { ctx, app } = this;

    // 获取前端传来的code
    const { code } = ctx.request.body;

    // 同过code 换取用户在第三方的token
    const res = await ctx.curl('https://gitee.com/oauth/token', {
      method: 'post',
      data: {
        grant_type: 'authorization_code',
        code,
        client_id: GiteePage.client_id,
        redirect_uri: GiteePage.redirect_uri,
        client_secret: GiteePage.client_secret,
      },
      dataType: 'json', // 规定返回值为json
    });

    // 用户在第三方的token
    const token = res.data.access_token;

    // 通过token 换取用户的详细信息
    const info = await ctx.curl(`https://gitee.com/api/v5/user?access_token=${token}`, { dataType: 'json' });

    // 将第三方信息 保存到我的数据库中
    const data = await app.mysql.get('userlist', { id: info.res.data.id });

    if (!data) {
      // 如果用户没有信息存在我自己的数据库中就让用户的信息入库
      await app.mysql.insert('userlist', {
        name: info.res.data.name,
        id: info.res.data.id,
        password: '123',
        username: info.res.data.login,
        img: info.res.data.avatar_url,
        pv: 0,
        num: 0,
        fans: 0,
        sex: 0,
        info: '',
        address: '',
      });
    }

    ctx.body = {
      code: 1,
      token: jwt.sign(info.res.data.id, '1907A'),
    };

  }
}

module.exports = LoginController;
